home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 275_02 / rijn31.c < prev    next >
Text File  |  1980-01-01  |  28KB  |  947 lines

  1.  
  2. /* rijn31.c                        */
  3. /* program for LCA31 option 'd'                */
  4. /* display de Bruijn diagram - 1st, 2nd, & 3rd gen    */
  5. /* Harold V. McIntosh, 20 February 1988            */
  6. /* 21 February 1988 - add j0=i0; to Pass 4's [HVM]    */
  7.  
  8. /*    Copyright (C) 1987        */
  9. /*    Copyright (C) 1988        */
  10. /*    Harold V. McIntosh        */
  11. /*    Gerardo Cisneros S.        */
  12.  
  13. # define JX   0.8  /* x-center, de Bruijn diagram    */
  14. # define JY   0.5  /* y-center, de Bruijn diagram    */
  15. # define RI 0.455  /* inner radius, de Bruijn diagram    */
  16. # define RO 0.475  /* outer radius, de Bruijn diagram    */
  17. # define NW    24  /* pause after so many lines        */
  18.  
  19. int  dd;        /* # points in de Bruijn ring    */
  20. int  mc, nc, nl;    /* column & line control    */
  21.  
  22. /* edit the de Bruijn diagram */
  23. edijn() {char c;
  24.  
  25.   clijn();
  26.   dd=KK*KK;
  27.   ijn(dd,KK,2);
  28.   while (0<1) {
  29.   videocursor(0,0,36);
  30.   videoputc('?',2);
  31.   c=kbdin();
  32.   if (c=='\015') break;
  33.   videocursor(0,0,38);
  34.   videoputc(c,2);
  35.   videocursor(0,0,36);
  36.   videoputc(' ',2);
  37.   videoscroll(1,0,24,14,0,0);
  38.   videocursor(0,0,0);
  39.   kwait(3);
  40.   switch (c) {
  41.     case 'A': dd=KK*KK; ijn(dd,KK,2); sijn(dd,0,1); break;
  42.     case 'B': dd=KK*KK; ijn(dd,KK,2); sijn(dd,1,1); break;
  43.     case 'C': dd=KK*KK; ijn(dd,KK,2); sijn(dd,2,1); break;
  44.     case 'D': dd=KK*KK; ijn(dd,KK,2); zijn(dd,0,1); break;
  45.     case 'E': dd=KK*KK; ijn(dd,KK,2); zijn(dd,1,1); break;
  46.     case 'F': dd=KK*KK; ijn(dd,KK,2); zijn(dd,2,1); break;
  47.     case 'G': kwait(0); printf("Precursors 0*:");  kwait(0); xpass1(0); break;
  48.     case 'H': kwait(0); printf("Precursors 1*:");  kwait(0); xpass1(1); break;
  49.     case 'I': kwait(0); printf("Precursors 2*:");  kwait(0); xpass1(2); break;
  50.     case 'a': kwait(0); printf("(1,1) gliders:");  kwait(0); apass1(2); break;
  51.     case 'b': kwait(0); printf("(1,0) static:");   kwait(0); apass1(1); break;
  52.     case 'c': kwait(0); printf("(1,-1) gliders:"); kwait(0); apass1(0); break;
  53.     case 'd': kwait(0); printf("(2,-2) gliders:"); kwait(0); bpass1(0); break;
  54.     case 'e': kwait(0); printf("(2,-1) gliders:"); kwait(0); bpass1(1); break;
  55.     case 'f': kwait(0); printf("(2,0) cycles:");   kwait(0); bpass1(2); break;
  56.     case 'g': kwait(0); printf("(2,1) gliders:");  kwait(0); bpass1(3); break;
  57.     case 'h': kwait(0); printf("(2,2) gliders:");  kwait(0); bpass1(4); break;
  58.     case 'i': kwait(0); printf("(3,-3) gliders:"); kwait(0); cpass1(0); break;
  59.     case 'j': kwait(0); printf("(3,-2) gliders:"); kwait(0); cpass1(1); break;
  60.     case 'k': kwait(0); printf("(3,-1) gliders:"); kwait(0); cpass1(2); break;
  61.     case 'l': kwait(0); printf("(3,0) cycles:");   kwait(0); cpass1(3); break;
  62.     case 'm': kwait(0); printf("(3,1) gliders:");  kwait(0); cpass1(4); break;
  63.     case 'n': kwait(0); printf("(3,2) gliders:");  kwait(0); cpass1(5); break;
  64.     case 'o': kwait(0); printf("(3,3) gliders:");  kwait(0); cpass1(6); break;
  65.     case 'p': kwait(0); printf("(4,-4) gliders:"); kwait(0); dpass1(0); break;
  66.     case 'q': kwait(0); printf("(4,-3) gliders:"); kwait(0); dpass1(1); break;
  67.     case 'r': kwait(0); printf("(4,-2) gliders:"); kwait(0); dpass1(2); break;
  68.     case 's': kwait(0); printf("(4,-1) gliders:"); kwait(0); dpass1(3); break;
  69.     case 't': kwait(0); printf("(4,0) cycles:");   kwait(0); dpass1(4); break;
  70.     case 'u': kwait(0); printf("(4,1) gliders:");  kwait(0); dpass1(5); break;
  71.     case 'v': kwait(0); printf("(4,2) gliders:");  kwait(0); dpass1(6); break;
  72.     case 'w': kwait(0); printf("(4,3) gliders:");  kwait(0); dpass1(7); break;
  73.     case 'x': kwait(0); printf("(4,4) gliders:");  kwait(0); dpass1(8); break;
  74.     case '1': dd=KK*KK; clijn(); ijn(dd,KK,2); break;
  75.     case '2': dd=KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  76.     case '3': dd=KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  77.     case '4': dd=KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  78.     case '5': dd=KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  79.     case '6': dd=KK*KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  80.     case '+': videopalette(WHCYMAG); break;
  81.     case '-': videopalette(YELREGR); break;
  82.     case '?': case '/': clijn(); break;
  83.     default: break;
  84.     }; /* end switch */
  85.   };   /* end while  */
  86.   videopalette(WHCYMAG);
  87.   videomode(T80X25);
  88. }
  89.  
  90. /* clear edijn screen and set up menu */
  91. clijn() {
  92.   videomode(COLGRAF);
  93.   videopalette(YELREGR);
  94.   videocursor(0,0,0);
  95.   scrrul();
  96.   videocursor(0,3,0);
  97.   printf("de Bruijn ring\n\n");
  98.   printf("abc   - (1,x)\n");
  99.   printf("ABC   - (all)\n");
  100.   printf("defgh - (2,x)\n");
  101.   printf("ijklmno (3,x)\n");
  102.   printf("pqrstuvwx (4)\n");
  103.   printf("123456 -diagram\n");
  104.   printf("DEF  -  0*1*2*\n");
  105.   printf("GHI  -  full n*\n");
  106.   printf("+-   - pallette\n");
  107.   printf("z  - clr screen\n");
  108.   printf("<cr> - exit\n\n");
  109. }
  110.  
  111. /* generate a de Bruijn diagram with m nodes, n links per node, color l */
  112. ijn(m,n,l) int m, n, l; {
  113. int    i, j;
  114. double ii, jj, nn, x, y, t, h;
  115. double sin(), cos();
  116. nn=(double)(n);
  117. t=6.28318/((double)(m));
  118. h=0.5*t;
  119. for (i=0; i<m; i++) {
  120.   ii=(double)(i);
  121.   for (j=0; j<n; j++) {
  122.     jj=(double)(j);
  123.     x=JX-RI*sin(ii*t+h);
  124.     y=JY-RI*cos(ii*t+h);
  125.     videoline(x,y,0);
  126.     x=JX-RO*sin((nn*ii+jj)*t+h);
  127.     y=JY-RO*cos((nn*ii+jj)*t+h);
  128.     videoline(x,y,l);
  129.     };
  130.   };
  131. }
  132.  
  133. /* insert a link into a de Bruijn diagram */
  134. /* m - number of vertices */
  135. /* u - initial vertex     */
  136. /* v - terminal vertex    */
  137. /* l - color of link      */
  138. lijnk(m,u,v,l) int m, u, v, l; {
  139. double uu, vv, x, y, t, h;
  140. double sin(), cos();
  141. t=6.28318/((double)(m));
  142. uu=t*((double)(u));
  143. vv=t*((double)(v));
  144. h=0.5*t;
  145. x=JX-RI*sin(uu+h);
  146. y=JY-RI*cos(uu+h);
  147. videoline(x,y,0);
  148. x=JX-RO*sin(vv+h);
  149. y=JY-RO*cos(vv+h);
  150. videoline(x,y,l);
  151. }
  152.  
  153. /* generate a de Bruijn diagram showing antecedents of state k in color l */
  154. sijn(m,k,l) int m, k, l; {
  155. int    i0, i1, i2;
  156. double th, x, y, t, h;
  157. double sin(), cos();
  158. t=6.28318/((double)(m));
  159. h=0.5*t;
  160. for (i0=0; i0<KK; i0++) {
  161. for (i1=0; i1<KK; i1++) {
  162. for (i2=0; i2<KK; i2++) {
  163.   if (k==ascrule[i0][i1][i2]-'0') {
  164.     th=((double)(i0*KK+i1))*t+h;
  165.     x=JX-RI*sin(th);
  166.     y=JY-RI*cos(th);
  167.     videoline(x,y,0);
  168.     th=((double)(i1*KK+i2))*t+h;
  169.     x=JX-RO*sin(th);
  170.     y=JY-RO*cos(th);
  171.     videoline(x,y,l);
  172.     };       /* end if    */
  173.   };};};   /* end for's */
  174. }       /* end sijn  */
  175.  
  176. /* generate a de Bruijn diagram showing the (1,k) links in color l */
  177. zijn(m,k,l) int m, k, l; {
  178. int    i, i0, i1, i2;
  179. double th, x, y, t, h;
  180. double sin(), cos();
  181. t=6.28318/((double)(m));
  182. h=0.5*t;
  183. for (i0=0; i0<KK; i0++) {
  184. for (i1=0; i1<KK; i1++) {
  185. for (i2=0; i2<KK; i2++) {
  186.   i=ascrule[i0][i1][i2]-'0';
  187.   if ((k==0 && i==i0) || (k==1 && i==i1) || (k==2 && i==i2)) {
  188.     th=((double)(i0*KK+i1))*t+h;
  189.     x=JX-RI*sin(th);
  190.     y=JY-RI*cos(th);
  191.     videoline(x,y,0);
  192.     th=((double)(i1*KK+i2))*t+h;
  193.     x=JX-RO*sin(th);
  194.     y=JY-RO*cos(th);
  195.     videoline(x,y,l);
  196.     };       /* end if    */
  197.   };};};   /* end for's */
  198. }       /* end zijn  */
  199.  
  200. /* plot graph on video screen            */
  201. /* move pen from present position to (x,y) */
  202. /* raised if l=0; color l if l>0       */
  203. videoline(x,y,l) double x, y; int l; {
  204. int k, ax, ay, dx, dy, di, dj, x1, y1;
  205. /* if (x<0.0) return; if (x>1.0) return */
  206. /* if (y<0.0) return; if (y>1.0) return */
  207. x1=(int)(199.0*(1.0-y));
  208. y1=(int)(199.0*x);
  209. dx=x1-ix0;
  210. dy=y1-iy0;
  211. ax=dx>=0?dx:-dx;
  212. ay=dy>=0?dy:-dy;
  213. di=dx>=0?1:-1; if (dx==0) di=0;
  214. dj=dy>=0?1:-1; if (dy==0) dj=0;
  215.  
  216. if (l>0) {if (ax!=0 || ay!=0) {
  217.   if (ax>=ay) {for (k=0; k<=ax; k++) videodot(ix0+di*k,60+iy0+(k*dy)/ax,l);}
  218.      else {for (k=0; k<=ay; k++) videodot(ix0+(k*dx)/ay,60+iy0+dj*k,l);};
  219.   }; };
  220. ix0=x1;
  221. iy0=y1;
  222. }
  223.  
  224. /* approximation to sine */
  225. double sin(x) double x; {
  226. if (x<0.0) return(-sin(-x));
  227. while (x>=6.28318) x-=6.28318;
  228. if (x>=3.142) return(-sin(x-3.14159));
  229. if (x>=1.571) return(sin(3.14159-x));
  230. return(x*(1.0-0.166*(x*x-0.05*x*x)));
  231. }
  232.  
  233. /* approximation to cosine */
  234. double cos(x) double x; {double sin(); return(sin(x+1.57079));}
  235.  
  236. /* ONE31.C */
  237.  
  238. /* Pass 1a analyzes all the configurations which fulfil (1,-1+l) */
  239. apass1(l) {
  240. char arry[KK][KK][KK];
  241. int  i,j,k,m;
  242. mc=2;
  243. asctobin();
  244. printf(" Pass1a\015");
  245. for (i